/**
 * @author 郑印
 * email: zhengyin.name@gmail.com
 * qq: 928020070
 */


/**
 * 增加jquery扩展
 */
(function($){
    $.fn.fiexible=function(json,iSpeed,centre,fn){
        this.each(function(){
            fiexible(this,json,iSpeed,centre,fn);
        })
    }
})(jQuery);

//弹性动画
function move(obj){
    jQuery.easing['jswing'] = jQuery.easing['swing'];
    jQuery.extend( jQuery.easing,
        {
            def: 'easeOutQuad',
            easeOutBounce: function (x, t, b, c, d) {
                if ((t/=d) < (1/2.75)) {
                    return c*(7.5625*t*t) + b;
                } else if (t < (2/2.75)) {
                    return c*(7.5625*(t-=(1.5/2.75))*t + .75) + b;
                } else if (t < (2.5/2.75)) {
                    return c*(7.5625*(t-=(2.25/2.75))*t + .9375) + b;
                } else {
                    return c*(7.5625*(t-=(2.625/2.75))*t + .984375) + b;
                }
            }
        });
    $(obj).animate({top:0},{
        easing: 'easeOutBounce',
        duration: 1000
    });
}

/**
 * 获取样式
 * @param {Object} obj
 * @param {Object} attr
 */
function __getStyle(obj,attr){
    if(obj.currentStyle){
        return obj.currentStyle[attr];
    }else{
        return getComputedStyle(obj,false)[attr];
    }
}
/**
 * 弹性运动动画
 * @param {Object} obj		对象
 * @param {Object} json		运动目标值
 * @param {Object} centre	是否从中点开始运动
 * @param {Object} fn		运动完成回调函数
 */
function fiexible(obj,json,iSpeed,centre,fn){
    var iSpeed = (iSpeed && iSpeed<=7 && iSpeed >0)?iSpeed:5;
    /*** 按坐标运动  ***/
    if(centre === true){
        var x = Math.floor(json.left + json.width/2);	//计算X轴中心点
        var y = Math.floor(json.top + json.height/2);	//计算Y轴中心点
        //设置初始的left 和 top 值 并让元素显示
        obj.style.display = 'block';
        obj.style.left = x-(parseInt(__getStyle(obj,'width'))/2) + 'px';
        obj.style.top = y-(parseInt(__getStyle(obj,'height'))/2) + 'px';
        //清除margin
        obj.style.margin = 0 + 'px';
    }
    var newJson = {}
    /*** 往参数中添加位置属性 用于设置元素的运动初始点 ***/
    for(var arg in json){
        newJson[arg] = [json[arg], parseInt(__getStyle(obj,arg))]
        //newJson[arg] = [运动目标点,运动初始点];
    }
    var oSite = {};
    /** 添加单独的属性值  **/
    for(var attr in newJson){
        oSite[attr] ={iSpeed:0,curSite:newJson[attr][1],bStop:false};
        //oSite[attr] = {运动初始速度,运动当前值,判断是否完成运动依据};
    }
    /** 运动开始前关闭本身的定时器 **/
    clearInterval(obj.t);
    obj.t = setInterval(function(){
        /*** 循环运动属性  ***/
        for (var attr in newJson) {
            /** 运动状态  **/
            oSite[attr].bStop = false;
            // iCur 更新运动元素当前的属性值
            if(attr=='opacity'){	//对透明度单独处理
                var iCur = parseInt(parseFloat(__getStyle(obj, attr))*100);
            }else{					//普通样式
                var iCur = parseInt(__getStyle(obj, attr));
            }
            oSite[attr].iSpeed += (newJson[attr][0] - iCur) /iSpeed;		//加速
            oSite[attr].iSpeed *= (iSpeed/10+0.25);							//磨擦
            oSite[attr].curSite += oSite[attr].iSpeed;				//更新运动的当前位置
            //运动停止条件 速度绝对值小于1 并且 当前值与目标值的差值的绝对值小于一
            if (Math.abs(oSite[attr].iSpeed) < 1 && Math.abs(iCur - newJson[attr][0]) < 1) {
                //设置样式，对透明度单独处理
                if(attr=='opacity'){
                    obj.style.filter='alpha(opacity='+newJson[attr][0]+')';
                    obj.style.opacity=newJson[attr][0]/100;
                }else{
                    obj.style[attr] = newJson[attr][0] + 'px';	//设置到目标点
                }
                oSite[attr].bStop = true;					//设置当前属性运动是否完成
            } else {
                //更新运动对象的属性值
                if(attr=='opacity'){
                    obj.style.filter='alpha(opacity='+oSite[attr].curSite+')';
                    obj.style.opacity=oSite[attr].curSite/100;
                }else{
                    obj.style[attr] = oSite[attr].curSite + 'px';
                }
            }
        }
        // 校验定时器停止
        if(checkStop(oSite)){
            clearInterval(obj.t);
            if(fn){
                fn.call(obj)
            }
        }
    }, 30);
    /** 校验运动是否完成 **/
    function checkStop(oSite){
        for(var i in oSite){
            if(oSite[i].bStop === false){
                return oSite[i].bStop;
            }
        }
        return true;
    }
}